﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>


//struct stu
//{
//	int arr[1000];
//	int age;
//};
//
//void add(struct stu* pc)
//{
//	pc->age = 100;
//	pc->arr[0] = -1;
//	pc->arr[1] = -2;
//	pc->arr[2] = -3;
//	pc->arr[3] = -4;
//	pc->arr[4] = -5;
//}
//
//void print(struct stu ps)
//{
//	printf("%d\n", ps.age);
//	for (int i = 0; i < 5; i++)
//	{
//		printf("%d ", ps.arr[i]);
//	}
//}
//
//int main()
//{
//	struct stu s = { {1,2,3,4,5},20 };
//	add(&s);
//	print(s);
//	return 0;
//}

//int main()
//{
//	char* pc[] = "abcdef";
//	pc = 'w';
//	return 0;
//}


//int main1()
//{
//	const char* pstr = "hello bit.";
//	printf("%s\n", pstr);
//	return 0;
//}
#include <stdio.h>
//int main()
//{
//	char str1[] = "hello bit.";
//	char str2[] = "hello bit.";
//	const char* str3 = "hello bit.";
//	const char* str4 = "hello bit.";
//	if (str1 == str2)
//		printf("str1 and str2 are same\n");
//	else
//		printf("str1 and str2 are not same\n");
//	if (str3 == str4)
//		printf("str3 and str4 are same\n");
//	else
//		printf("str3 and str4 are not same\n");
//	return 0;
//}

//int main()
//{
//	int* p1;//存放的是整型变量地址，能够指向整型数据的指针。
//	char* p2;//存放的是字符变量地址，能到指向字符数据的指针。
//	double* p3;//存放的是浮点型变脸的地址，能够指向浮点型数据的指针。
//	return 0;
//}

//int main()
//{
//	int arr[5] = { 1,2,3,4,5 };
//	int(*p)[5] = &arr;
//	return 0;
//}

//void add(int arr[3][3], int r, int s)
//{
//	for (int i = 0; i < r; i++)
//	{
//		for (int j = 0; j < s; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//}
//
//int main()
//{
//	int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
//	add(arr, 3, 3);
//	return 0;
//}

//void test(int(*p)[5], int r, int s)
//{
//	for (int i = 0; i < r; i++)
//	{
//		for (int j = 0; j < s; j++)
//		{
//			printf("%d ", (*(*p+i)+j));
//		}
//		printf("\n");
//	}
//}
//
//int main()
//{
//	int arr[3][5] = { {1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7} };
//	test(arr, 3, 5);
//	return 0;
//}

//int add(int x, int y)
//{
//	return x + y;
//}
//
//int main()
//{
//	/*int sz = add(3, 5);*/
//	printf("%d\n", sz);
//	return 0;
//}

//int add(int x, int y)
//{
//	return x + y;
//}
//
//int main()
//{
//	int (*p)(int x, int y) = add;
//	printf("%d\n", p(3,5));
//	printf("%d\n", (*p)(4, 6));
//	return 0;
//}

//typedef unsigned int uint;
//
//int main()
//{
//	unsigned int a = 10;
//	uint b = 30;
//	return;
//}

//typedef int* test;
//
//typedef int(*add)[10];
//
//typedef int(*fun)(int,int);


//int add(int x, int t)
//{
//	return x + y;
//}
//
//int sub(int x, int t)
//{
//	return x - y;
//}

//int mul(int x, int t)
//{
//	return x * y;
//}
//
//int div(int x, int t)
//{
//	return x / y;
//}
//
//int main()
//{
//	int (*p[5])(int, int) = { add,sub,mul,div };
//
//	return 0;
//}
#include <stdlib.h>

//int cmp(const void* p1, const void* p2)
//{
//	return *(int*)p1 - *(int*)p2;
//}
//
//void Swap(char* buf1, char* buf2, int width)
//{
//	for (int i = 0; i < width; i++) 
//	{
//		char tmp = buf1[i];
//		buf1[i] = buf2[i];
//		buf2[i] = tmp;
//	}
//}
//
//void bubble_sort(void* base, size_t count, size_t width, int(*cmp)(const void*, const void*))
//{
//	for (int i = 0; i < count -1; i++)
//	{
//		for (int j = 0; j < count -i-1; j++)
//		{
//			if (cmp(((char*)base + width * j), (char*)base + width * (j+1))>0)
//			{
//				Swap(((char*)base + width * j), (char*)base + width * (j + 1), width);
//			}
//		}
//	}
//}
int cmp(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}

void Swap(char* buf1, char* buf2, int width)
{
	for (int i = 0; i < width; i++)
	{
		char tmp = buf1[i];
		buf1[i] = buf2[i];
		buf2[i] = tmp;
	}
}

void bubble_sort(void* base, size_t count, size_t width, int (*cmp)(const void*, const void*))
{
	for (size_t i = 0; i < count - 1; i++)
	{
		for (size_t j = 0; j < count - i - 1; j++)
		{
			if (cmp(((char*)base + j * width), (char*)base + (j + 1) * width) > 0)
			{
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}


void test1()
{
	int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
	int count = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, count, sizeof(arr[0]), cmp);
	for (int i = 0; i < count; i++)
	{
		printf("%d ", arr[i]);
	}
}


int main()
{
	test1();
	return 0;
}